home *** CD-ROM | disk | FTP | other *** search
/ Programmer Plus 2007 / Programmer-Plus-2007.iso / Programming / Borland Plateform / Turbo Prolog 2 / EXAMPL57.PRO < prev    next >
Encoding:
Prolog Source  |  1986-04-25  |  1.2 KB  |  38 lines

  1.                   /* Program 57 */
  2.              
  3. domains
  4.     queen = q(integer,integer)
  5.     queens=queen*
  6.     freelist = integer*
  7.     board=board(queens,freelist,freelist,freelist,freelist)
  8. predicates
  9.     placeN(integer,board,board)
  10.     place_a_queen(integer,board,board)
  11.     nqueens(integer)
  12.     makelist(integer,freelist)
  13.     findandremove(integer,freelist,freelist)
  14. clauses
  15.     nqueens(N):-
  16.         makelist(N,L),Diagonal=N*2-1,makelist(Diagonal,LL),
  17.         placeN(N,board([],L,L,LL,LL),Final),write(Final).
  18.  
  19.     placeN(_,board(D,[],[],D1,D2),board(D,[],[],D1,D2)):-!.
  20.     placeN(N,Board1,Result):-
  21.         place_a_queen(N,Board1,Board2),
  22.         placeN(N,Board2,Result).
  23.  
  24.     place_a_queen(N,board(Queens,Rows,Columns,Diag1,Diag2),
  25.             board([q(R,C)|Queens],NewR,NewC,NewD1,NewD2)):-
  26.         findandremove(R,Rows,NewR),
  27.         findandremove(C,Columns,NewC),
  28.         D1=N+C-R,findandremove(D1,Diag1,NewD1),
  29.         D2=R+C-1,findandremove(D2,Diag2,NewD2).
  30.  
  31.    findandremove(X,[X|Rest],Rest).
  32.    findandremove(X,[Y|Rest],[Y|Tail]):-
  33.         findandremove(X,Rest,Tail).
  34.  
  35.    makelist(1,[1]).
  36.    makelist(N,[N|Rest]):-
  37.         N>0,N1=N-1,makelist(N1,Rest).
  38.